void remdiv(long x, long y, long *qp, long *rp) {
    // Compute the quotient and remainder of x divided by y
    long q = x / y; // Integer division
    long r = x % y; // Modulus operation

    // Store the quotient and remainder in the provided pointers
    *qp = q;
    *rp = r;
}

// Usage:
// 1. Assemble the code:
//    gcc -Og -S -o div3.5.5.s div3.5.5.c

// x在rdi寄存器中，y在rsi寄存器中，qp在rdx寄存器中，rp在rcx寄存器中

// 输出结果：
// movq	%rdi, %rax      # 将x存储到rax寄存器中，当作被除数，之所以要转移到rax中，是因为除法指令的被除数必须存储在rax寄存器中和rdx寄存器中
// movq	%rdx, %rdi      # 将qp存储到rdi寄存器中, 因为rdi寄存器在上一步用完了，现在腾出来了可以被我们使用了，又因为rdx寄存器必须腾出来给除法操作使用
// cqto                 # 把rax寄存器中的值符号扩展到rdx寄存器中，现在相当于 rax+rdx = x (联合存储被除数)
// idivq	%rsi        # 除法操作，除数存储在rsi寄存器中，结果存储在rax和rdx寄存器中
// movq	%rax, (%rdi)    # 将商存储到qp指向的内存地址中
// movq	%rdx, (%rcx)    # 将余数存储到rp指向的内存地址中
// ret                  # 返回到调用者


// 不得不说，这个编译还是挺有意思的。
// 注意事项： 此处使用的除法指令是 idivq 表示有符号除法，除数存储在rsi寄存器中，被除数存储在rax和rdx寄存器中，结果存储在rax和rdx寄存器中。
//           如果是无符号除法，则使用 divq 指令，除数存储在rsi寄存器中，被除数存储在rax寄存器中，结果存储在rax和rdx寄存器中。